import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Mytest extends JFrame implements ActionListener {
    // 定义两个面板
    private JPanel north,center;
    // 文本框 用于显示计算结果
    private JTextField field;
    // 定义按钮
    private JButton[] btns;
    // 按钮文字数组
    private String[] str;
    // 计算引擎
    private ScriptEngine engine;

    // 构造函数
    public Mytest(){
        // 设置窗口标题
        setTitle("计算器");
        // 设置窗口大小 宽 高
        setSize(700,700);
        // 关闭窗口时结束程序
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        // 设置窗口的位置
        setLocation((int)(Toolkit.getDefaultToolkit().getScreenSize().getWidth() - this.getWidth())/2,
                (int)(Toolkit.getDefaultToolkit().getScreenSize().getHeight() - this.getHeight())/2);
        // 初始化窗口
        initComponent();
        // 设置窗口可见
        setVisible(true);
    }
    // 初始化窗口的方法
    // 无参、无返回值
    private void initComponent() {
        // 窗口中添加内容
        // 创建面板
        north = new JPanel();
        center = new JPanel();
        // 创建文本框
        field = new JTextField();
        // 设置文本框属性
        // field.setColumns();
        // 设置宽高属性
        field.setPreferredSize(new Dimension(700,150));
        //添加显示的文本框颜色
        field.setBackground(Color.lightGray);

        // 输入框禁止编辑
        field.setEditable(false);
        // 设置一个字体格式
        Font font = new Font("SansSerif",Font.BOLD,25);
        // 设置字体、加粗、大小
        field.setFont(font);
        // 以数组的形式声明的按钮字符
        str = new String[]{
            "7","8","9","+",
            "4","5","6","-",
            "1","2","3","×",
            "0",".","=","÷",
            "C","B","T","S",
            "sin","cos","tan","😊",
        };
        // 创建按钮
        btns = new JButton[str.length];
        for (int i = 0; i < btns.length; i++){
            btns[i] = new JButton(str[i]);
            btns[i].setFont(new Font("SansSerif",Font.BOLD,25));
            //添加输入框颜色
            btns[i].setBackground(Color.pink);

        };
        // 获取JavaScript引擎
        ScriptEngineManager manager = new ScriptEngineManager();
        engine = manager.getEngineByName("javascript");
        // 设置布局
        north.setLayout(new BorderLayout());
        // 设置按钮面板的布局
        center.setLayout(new GridLayout(6,4));
        // 将文本框添加到上面的面板
        north.add(field);
        // 将btn添加到center面板
        for (int i = 0; i < btns.length; i++){
            center.add(btns[i]);
        }
        // 将面板添加到窗口中
        this.add(north,BorderLayout.NORTH);
        this.add(center);
        // 给按键添加事件监听
        for (int i = 0; i < btns.length; i++){
            btns[i].addActionListener(this);
        }

    }
    // 将按键上的文字显示到输入框
    public void showBtnText(String text){
        // System.out.println(text);
        // 判断text是不是数字
        // 用正则表达式检测text是不是数字
        // Boolean isNum = text.matches("\\d");
        // if (isNum){
        //     // 如果是数字，就拼接到字符串上
        //     // 输入框上已有的文字
        // }else{
            // 如果不是数字，就特殊处理
            // 如果是运算符怎么办?
            if("C".equals(text)){
              System.out.println("C");
              // 清除输入框
              field.setText("");
            }else if("B".equals(text)){
              System.out.println("B");
              // 删除最后一位
              // 当前文本框的内容
              // String
              if(field.getText().length()>0){
                // 先获取输入框的内容，然后截取掉最后一位，将截取后的内容重新设置到输入框
                field.setText(field.getText().substring(0, field.getText().length()-1));
              }
            }else if("T".equals(text)){
              System.out.println("T");
              // 显示时间
            }else if("S".equals(text)){
              System.out.println("S");
              // 关闭时间
            }else if("=".equals(text)){
              System.out.println("=");
              try{
                  // 获得要计算的内容
                  String txt = field.getText();
                  System.out.println(txt);
                  txt = txt.replaceAll("×","*").replaceAll("÷","/");
                  // 使用计算引擎计算结果
                  System.out.println(txt);
                  Object o = engine.eval(txt);
                  // 计算输入框中的内容
                  // 将 o 转换为字符串
                  field.setText(o+"");
              }catch(Exception e){
                  e.printStackTrace();
              }
            }
            else if("sin".equals(text)){
                field.setText(Double.toString(Math.sin(Double.parseDouble(field.getText()))));
            }

            else if("cos".equals(text)){
                field.setText(Double.toString(Math.cos(Double.parseDouble(field.getText()))));
            }
            else if("tan".equals(text)){
                field.setText(Double.toString(Math.tan(Double.parseDouble(field.getText()))));
            }
            
            // 如果是运算符
            // 保留已输入的数字
            // String oldNum = field.getText();
            // System.out.println(oldNum);
            // 清空输入区
            // field.setText(text);
            else{
              // 数字 . 和 运算符
              String oldText = field.getText();
              field.setText(oldText + text);
            }
        // }
    }
    // 重写方法
    @Override
    public void actionPerformed(ActionEvent e) {
        // 输出捕获到的 Action
        // System.out.println(e.getSource());
        Object source = e.getSource();
        if (source instanceof JButton){
            JButton btn = (JButton) source;
            // 获取按键的文字
            String text = btn.getText();
            // System.out.println(text);
            // 展示文字到输入框上
            this.showBtnText(text);
        }
    }
    // main方法
    public static void main(String[] args) {
        // System.out.println("hello,world");
        // 创建一个实例
        new Mytest();
    }
}